#ifndef TIEC_COMPILER_H
#define TIEC_COMPILER_H

#include "macro.h"
#include "parser.h"
#include "component.h"

namespace NS_TIEC {

  /// 编译时的任务监听接口
  class TaskListener {
  public:
    /// 某个Task阶段开始
    /// @param kind Task阶段（解析、符号填充、语义分析、最终输出）
    virtual void onTaskBegin(const TaskKind& kind) = 0;
    /// 某个Task阶段结束
    virtual void onTaskEnd(const TaskKind& kind) = 0;
  };

  class Compiler {
  public:
    /// 获取编译器上下文
    virtual PTR<Context> getContext() = 0;

    /// 添加一个任务监听器
    /// @param listener 监听器实现
    virtual void addTaskListener(const PTR<TaskListener>& listener) = 0;

    /// 移除一个任务监听器
    virtual void removeTaskListener(const PTR<TaskListener>& listener) = 0;

    /// 设置自定义诊断信息收集器
    /// @param handler DiagnosticHandler实现
    virtual void setDiagnosticHandler(const PTR<DiagnosticHandler>& handler) = 0;

    /// 编译源文件
    /// @param sources 所有源文件
    virtual void compile(const List<PTR<Source>>& sources) = 0;
  };

  /// 编译器工厂类
  class CompilerFactory {
  public:
    /// 创建编译器
    /// \param context 编译器上下文\
    /// \return 解析器对象
    static PTR<Compiler> makeCompiler(const PTR<Context>& context);

    /// 创建语法解析器
    /// \param context 编译器上下文
    /// \param source 代码输入源
    /// \return 解析器对象
    static PTR<Parser> makeParser(const PTR<Context>& context, const PTR<Source>& source);
  };
}

#endif //TIEC_COMPILER_H
